使用 Golang 的 goroutine 來進行排程,
透過建立緩衝區,等待 goroutine 來取得待處理的資料,
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
const (
numberGoroutineList = 4
numberTaskList = 10
)
var wg sync.WaitGroup
func init() {
rand.Seed(time.Now().Unix())
}
func main() {
taskList := make(chan string, numberTaskList)
wg.Add(numberGoroutineList)
for gr := 1; gr <= numberGoroutineList; gr++ {
go worker(taskList, gr)
}
for post := 1; post <= numberTaskList; post++ {
taskList <- fmt.Sprintf("任務 : %d", post)
}
close(taskList)
wg.Wait()
}
func worker(taskList chan string, worker int) {
defer wg.Done()
for {
task, ok := <-taskList
if !ok {
fmt.Printf("工人: %d: 關閉\n", worker)
return
}
fmt.Printf("工人: %d: 開始 %s\n", worker, task)
sleep := rand.Int63n(100)
time.Sleep(time.Duration(sleep) * time.Millisecond)
fmt.Printf("工人: %d: 完成 %s\n", worker, task)
}
}
taskList 是作為緩衝區,使用 make(chan string, 10)
產生go worker()
產生 goroutine 來進行作業
taskList <-
放進去通道中<-taskList
從通道中取出
AomaShinku:goroutine aomashinku$ go run main.go
工人: 4: 開始 任務 : 4
工人: 2: 開始 任務 : 1
工人: 3: 開始 任務 : 2
工人: 1: 開始 任務 : 3
工人: 3: 完成 任務 : 2
工人: 3: 開始 任務 : 5
工人: 1: 完成 任務 : 3
工人: 1: 開始 任務 : 6
工人: 2: 完成 任務 : 1
工人: 2: 開始 任務 : 7
工人: 4: 完成 任務 : 4
工人: 4: 開始 任務 : 8
工人: 1: 完成 任務 : 6
工人: 1: 開始 任務 : 9
工人: 3: 完成 任務 : 5
工人: 3: 開始 任務 : 10
工人: 4: 完成 任務 : 8
工人: 4: 關閉
工人: 1: 完成 任務 : 9
工人: 1: 關閉
工人: 2: 完成 任務 : 7
工人: 2: 關閉
工人: 3: 完成 任務 : 10
工人: 3: 關閉
AomaShinku:goroutine aomashinku$
完成用 goroutine 來處理資料